﻿using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using DevExpress.XtraCharts;
using DevExpress.XtraEditors;
using NLog;

namespace QuanLyKhachSan
{
    public partial class TabTKSLKhach : XtraUserControl, IGeneatetabName
    {
        private HoaDonThuePhongManager hdThuePhong = new HoaDonThuePhongManager();
        protected static Logger _logger = LogManager.GetCurrentClassLogger();

        private ChartControl chart;

        public TabTKSLKhach()
        {
            InitializeComponent();
        }

        public string Getname()
        {
            return "Thống kê số lượng khách";
        }

        private ChartControl CreateChart(String title)
        {
            splitContainerControl1.Panel2.Controls.Remove(chart);
            ChartControl sideChart = new ChartControl();

            chart = sideChart;
            sideChart.Legend.Visible = false;

            ChartTitle chartTitle1 = new ChartTitle { Text = title };
            sideChart.Titles.Add(chartTitle1);

            sideChart.Dock = DockStyle.Fill;
            splitContainerControl1.Panel2.Controls.Add(sideChart);
            return chart;
        }

        private int TinhSLKhachTheoThang(int thang)
        {
            _logger.Info(Commons.ToString() + ",Chọn thao tác thống kê số lượng khách theo tháng");

            int tongKhach = 0;
            try
            {
                var hdPhong =
                    hdThuePhong.LayDanhSach()
                        .Result.Where(t => t.NgayDen.Value.Year.Equals(DateTime.Now.Year) && t.NgayDen.Value.Month.Equals(thang)).ToList();
                foreach (var hd in hdPhong)
	            {
                    tongKhach += hd.ChiTietHoaDonThuePhongs.Count;
	            }
            }
            catch (Exception)
            {
                return 0;
            }
            return tongKhach;
        }

        private void btnThongKeTheoThang_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            ChartControl sideBySideBarChart = CreateChart("THỐNG KÊ SỐ LƯỢNG KHÁCH THEO THÁNG");
            
            var series1 = new Series("Side-by-Side Bar Series 1", ViewType.Bar);
            for (int i = 1; i < 13; i++)
            {
                try
                {
                    int tongKhach = TinhSLKhachTheoThang(i);
                    series1.Points.Add(new SeriesPoint("Tháng " + i, tongKhach));
                }
                catch (Exception ex)
                {
                    XtraMessageBox.Show(ex.Message);
                    break;
                }

            }
            sideBySideBarChart.Series.Add(series1);
        }

        private int TinhSLKhachTheoNam(int nam)
        {
            int tongKhach = 0;
            _logger.Info(Commons.ToString() + ",Chọn thao tác thống kê số lượng khách theo năm");

            try
            {
                var hdPhong =
                    hdThuePhong.LayDanhSach()
                        .Result.Where(t => t.NgayLapHD.Value.Year.Equals(nam)).ToList();
                foreach (var hd in hdPhong)
                {
                    tongKhach += hd.ChiTietHoaDonThuePhongs.Count;
                }
            }
            catch (Exception)
            {
                return 0;
            }
            return tongKhach;
        }

        private int TinhSLKhachTheoQuy(int quy)
        {
            _logger.Info(Commons.ToString() + ",Chọn thao tác thống kê số lượng khách theo quý");

            int tongKhach = 0;
            try
            {
                for (int i = quy - 2; i <= quy; i++)
                {
                    tongKhach += TinhSLKhachTheoThang(i);
                }
            }
            catch (Exception)
            {
                return 0;
            }
            return tongKhach;
        }

        private void btnThongKeTheoQuy_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            ChartControl sideBySideBarChart = CreateChart("THỐNG KÊ SỐ LƯỢNG KHÁCH THEO QÚY");

            var series1 = new Series("Side-by-Side Bar Series 1", ViewType.Bar);
            series1.Points.Add(new SeriesPoint("Qúy I", TinhSLKhachTheoQuy(3)));
            series1.Points.Add(new SeriesPoint("Qúy II", TinhSLKhachTheoQuy(6)));
            series1.Points.Add(new SeriesPoint("Qúy III", TinhSLKhachTheoQuy(9)));
            series1.Points.Add(new SeriesPoint("Qúy IV", TinhSLKhachTheoQuy(12)));
            sideBySideBarChart.Series.Add(series1);
        }

        private void btnTheoNam_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            ChartControl sideBySideBarChart = CreateChart("THỐNG KÊ SỐ LƯỢNG KHÁCH THEO NĂM");

            var series1 = new Series("Side-by-Side Bar Series 1", ViewType.Bar);
            int crYear = DateTime.Now.Year;
            for (int i = crYear - 5; i <= crYear; i++)
            {
                series1.Points.Add(new SeriesPoint("Năm " + i, TinhSLKhachTheoNam(i)));
            }
            sideBySideBarChart.Series.Add(series1);
        }

        private void barExport_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            _logger.Info(Commons.ToString() + ",Chọn thao tác in biểu đồ thống kê số lượng khách theo tháng");

            try
            {
                var sv = new SaveFileDialog();
                sv.Filter = "Format(*.xls)|*.xls";
                sv.ShowDialog();

                var xlsStream = new FileStream(sv.FileName, FileMode.Create);
                chart.ExportToXls(xlsStream);

                var rs = XtraMessageBox.Show("Bạn có muốn mở file vừa save?", "Questions", MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question);

                if (rs == DialogResult.Yes)
                {
                    Process.Start(@sv.FileName);
                }

                xlsStream.Close();
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message);
            }
            
        }
    }
}
